{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantum Process Tomography with Q# and Python #"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Abstract ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this sample, we will demonstrate interoperability between Q# and Python by using the QInfer and QuTiP libraries for Python to characterize and verify quantum processes implemented in Q#.\n",
    "In particular, this sample will use *quantum process tomography* to learn about the behavior of a \"noisy\" Hadamard operation from the results of random Pauli measurements."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preamble ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.simplefilter('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can enable Q# support in Python by importing the `qsharp` package."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing Q# environment...\n",
      "."
     ]
    }
   ],
   "source": [
    "import qsharp "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we do so, any Q# source files in the current working directory are compiled, and their namespaces are made available as Python modules.\n",
    "For instance, the `Quantum.qs` source file provided with this sample implements a `HelloWorld` operation in the `Microsoft.Quantum.Samples.Python` Q# namespace:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "// Copyright (c) Microsoft Corporation. All rights reserved.\n",
      "// Licensed under the MIT License.\n",
      "namespace Microsoft.Quantum.Samples.Python {\n",
      "    open Microsoft.Quantum.Intrinsic;\n",
      "    open Microsoft.Quantum.Canon;\n",
      "    open Microsoft.Quantum.Preparation;\n",
      "\n",
      "    function HelloWorld (pauli : Pauli) : Unit {\n",
      "        Message($\"Hello, world! {pauli}\");\n",
      "    }\n",
      "\n",
      "    operation NoisyHadamardChannelImpl (depol : Double, target : Qubit) : Unit {\n",
      "        let idxAction = Random([1.0 - depol, depol]);\n",
      "\n",
      "        if (idxAction == 0) {\n",
      "            H(target);\n",
      "        }\n",
      "        else {\n",
      "            PrepareSingleQubitIdentity(target);\n",
      "        }\n",
      "    }\n",
      "\n",
      "    function NoisyHadamardChannel (depol : Double) : (Qubit => Unit) {\n",
      "        return NoisyHadamardChannelImpl(depol, _);\n",
      "    }\n",
      "\n",
      "}\n",
      "\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('Quantum.qs') as f:\n",
    "    print(f.read())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can import this `HelloWorld` operation as though it was an ordinary Python function by using the Q# namespace as a Python module:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Microsoft.Quantum.Samples.Python import HelloWorld"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Q# callable Microsoft.Quantum.Samples.Python.HelloWorld>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we've imported the new names, we can then ask our simulator to run each function and operation using the `simulate` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, world! PauliZ\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "()"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld.simulate(pauli=qsharp.Pauli.Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tomography ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `qsharp` interoperability package also comes with a `single_qubit_process_tomography` function which uses the QInfer library for Python to learn the channels corresponding to single-qubit Q# operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qsharp.tomography import single_qubit_process_tomography"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we import plotting support and the QuTiP library, since these will be helpful to us in manipulating the quantum objects returned by the quantum process tomography functionality that we call later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import qutip as qt\n",
    "qt.settings.colorblind_safe = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To use this, we define a new operation that takes a preparation and a measurement, then returns the result of performing that tomographic measurement on the noisy Hadamard operation that we defined in `Quantum.qs`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "experiment = qsharp.compile(\"\"\"\n",
    "open Microsoft.Quantum.Samples.Python;\n",
    "open Microsoft.Quantum.Characterization;\n",
    "\n",
    "operation Experiment(prep : Pauli, meas : Pauli) : Result {\n",
    "    return SingleQubitProcessTomographyMeasurement(prep, meas, NoisyHadamardChannel(0.1));\n",
    "}\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, we ask for 10,000 measurements from the noisy Hadamard operation that we defined above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing tomography model...\n",
      "Performing tomography...\n"
     ]
    }
   ],
   "source": [
    "estimation_results = single_qubit_process_tomography(experiment, n_measurements=10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To visualize the results, it's helpful to compare to the actual channel, which we can find exactly in QuTiP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "depolarizing_channel = sum(map(qt.to_super, [qt.qeye(2), qt.sigmax(), qt.sigmay(), qt.sigmaz()])) / 4.0\n",
    "actual_noisy_h = 0.1 * qt.to_choi(depolarizing_channel) + 0.9 * qt.to_choi(qt.hadamard_transform())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We then plot the estimated and actual channels as Hinton diagrams, showing how each acts on the Pauli operators $X$, $Y$ and $Z$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(None, <matplotlib.axes._subplots.AxesSubplot at 0x7f9ce9283950>)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9ce9329610>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (left, right) = plt.subplots(ncols=2, figsize=(12, 4))\n",
    "plt.sca(left)\n",
    "plt.xlabel('Estimated', fontsize='x-large')\n",
    "qt.visualization.hinton(estimation_results['est_channel'], ax=left)\n",
    "plt.sca(right)\n",
    "plt.xlabel('Actual', fontsize='x-large')\n",
    "qt.visualization.hinton(actual_noisy_h, ax=right)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also obtain a wealth of other information as well, such as the covariance matrix over each parameter of the resulting channel.\n",
    "This shows us which parameters we are least certain about, as well as how those parameters are correlated with each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]),\n",
       " <a list of 16 Text xticklabel objects>)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9ce9283150>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "estimation_results['posterior'].plot_covariance()\n",
    "plt.xticks(rotation=90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Diagnostics ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jupyter Core        1.1.14623.0\n",
      "iqsharp             0.8.1907.1701\n",
      "qsharp              0.8.1907.1701\n"
     ]
    }
   ],
   "source": [
    "for component, version in sorted(qsharp.component_versions().items(), key=lambda x: x[0]):\n",
    "    print(f\"{component:20}{version}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.7.4 (default, Jul 17 2019, 23:33:46) \n",
      "[GCC 6.3.0 20170516]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.version)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
